--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit fe44d05f425884dcd7d12cb3486bf0215a154428
Parents : dde6d8c
Author : Ivan <ivan@quad4.io>
Signature : Signature validation error
Date : 2026-04-16T04:51:18-05:00
refactor(telephone_manager): improve call initiation handling and UI update logic
Changes
2 files changed, 26 insertions(+), 19 deletions(-)
Diff
diff --git a/meshchatx/src/backend/telephone_manager.py b/meshchatx/src/backend/telephone_manager.py
index 43b01924..0cd840b3 100644
--- a/meshchatx/src/backend/telephone_manager.py
+++ b/meshchatx/src/backend/telephone_manager.py
@@ -438,26 +438,25 @@ class TelephoneManager:
finally:
if self._is_initiation_cancelled():
self._update_initiation_status(None, None)
- return
+ else:
+ # Wait for either establishment, failure, or a timeout
+ # to ensure the UI has something to show (either active_call or initiation_status)
+ for _ in range(40): # Max 4 seconds of defensive waiting
+ if self.telephone and (
+ self.telephone.active_call
+ or self.telephone.call_status in [0, 1, 3, 6]
+ ):
+ break
+ await asyncio.sleep(self._status_poll_interval_s)
- # Wait for either establishment, failure, or a timeout
- # to ensure the UI has something to show (either active_call or initiation_status)
- for _ in range(40): # Max 4 seconds of defensive waiting
+ # If call was successful, keep status for a moment to prevent UI flicker
+ # while the frontend picks up the new active_call state
if self.telephone and (
- self.telephone.active_call
- or self.telephone.call_status in [0, 1, 3, 6]
+ (self.telephone.active_call and self.telephone.call_status == 6)
+ or self.telephone.call_status in [2, 4, 5]
):
- break
- await asyncio.sleep(self._status_poll_interval_s)
-
- # If call was successful, keep status for a moment to prevent UI flicker
- # while the frontend picks up the new active_call state
- if self.telephone and (
- (self.telephone.active_call and self.telephone.call_status == 6)
- or self.telephone.call_status in [2, 4, 5]
- ):
- await asyncio.sleep(1.0)
- self._update_initiation_status(None, None)
+ await asyncio.sleep(1.0)
+ self._update_initiation_status(None, None)
def mute_transmit(self):
if self.telephone:
diff --git a/tests/backend/test_lxst_integration.py b/tests/backend/test_lxst_integration.py
index 52a49ec4..4ef5e47e 100644
--- a/tests/backend/test_lxst_integration.py
+++ b/tests/backend/test_lxst_integration.py
@@ -17,9 +17,11 @@ from meshchatx.src.backend.telephone_manager import TelephoneManager
class _DummyThread:
- def __init__(self, target=None, daemon=None):
+ def __init__(self, target=None, daemon=None, args=(), kwargs=None, **_extra):
self.target = target
self.daemon = daemon
+ self.args = args
+ self.kwargs = kwargs or {}
def start(self):
return None
@@ -85,6 +87,7 @@ def test_lxst_telephone_lifecycle_and_timeouts(monkeypatch):
def test_lxst_switch_profile_updates_codec_and_frame_time(monkeypatch):
_install_lxst_stubs(monkeypatch)
identity = _mock_identity()
+ fake_codec = object()
class _FakeMixer:
def __init__(self, target_frame_ms=None, gain=0.0):
@@ -130,6 +133,11 @@ def test_lxst_switch_profile_updates_codec_and_frame_time(monkeypatch):
monkeypatch.setattr(LXSTTelephony, "Mixer", _FakeMixer)
monkeypatch.setattr(LXSTTelephony, "LineSource", _FakeLineSource)
monkeypatch.setattr(LXSTTelephony, "Pipeline", _FakePipeline)
+ monkeypatch.setattr(
+ LXSTTelephony.Profiles,
+ "get_codec",
+ lambda _profile: fake_codec,
+ )
telephone = LXSTTelephony.Telephone(identity)
telephone.call_status = LXSTTelephony.Signalling.STATUS_ESTABLISHED
@@ -148,7 +156,7 @@ def test_lxst_switch_profile_updates_codec_and_frame_time(monkeypatch):
assert telephone.target_frame_time_ms == LXSTTelephony.Profiles.get_frame_time(
LXSTTelephony.Profiles.QUALITY_HIGH
)
- assert telephone.transmit_codec is not None
+ assert telephone.transmit_codec is fake_codec
telephone.active_call = None
telephone.teardown()
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────